<script>
  //   给你一份『词汇表』（字符串数组） words 和一张『字母表』（字符串） chars。

  //   假如你可以用 chars 中的『字母』（字符）拼写出 words 中的某个『单词』（字符串），那么我们就认为你掌握了这个单词。

  //   注意：每次拼写（指拼写词汇表中的一个单词）时，chars 中的每个字母都只能用一次。

  //   返回词汇表 words 中你掌握的所有单词的 长度之和。

  //   来源：力扣（LeetCode）
  //   链接：https://leetcode.cn/problems/find-words-that-can-be-formed-by-characters

  //   示例 1：

  //   输入：words = ["cat","bt","hat","tree"], chars = "atach"
  //   输出：6
  //   解释：
  //   可以形成字符串 "cat" 和 "hat"，所以答案是 3 + 3 = 6。
  //   示例 2：

  //   输入：words = ["hello","world","leetcode"], chars = "welldonehoneyr"
  //   输出：10
  //   解释：
  //   可以形成字符串 "hello" 和 "world"，所以答案是 5 + 5 = 10。

  //   来源：力扣（LeetCode）
  //   链接：https://leetcode.cn/problems/find-words-that-can-be-formed-by-characters

  /**
   * 分析
   * 收集chars
   * 记录每个的字母出现的次数
   * 遍历单词表
   * 如果出现一次 那么进行 -- 直到小于0 就不可以
   * 如果刚好匹配 记录单词的长度 累加
   */

  /**
   * @param {string[]} words
   * @param {string} chars
   * @return {number}
   */
  var countCharacters = function (words, chars) {
    var alphabet = {};
    var res = 0;
    for (const k of chars) {
      if (!alphabet[k]) {
        alphabet[k] = 1;
      } else {
        alphabet[k] = alphabet[k] + 1;
      }
    }
    console.log(alphabet);

    for (var i = 0; i < words.length; i++) {
      const map = { ...alphabet };
      let isComplete = true;
      for (const w of words[i]) {
        if (map[w] > 0) {
          map[w]--;
          continue;
        } else {
          isComplete = false;
          break;
        }
      }
      isComplete && (res += words[i].length);
    }
    return res;
  };

  console.log(countCharacters(['cat', 'bt', 'hat', 'tree'], 'atach'));
</script>
